#include "Juego.h"
#include <sstream>

Juego::Juego(Json::Value root) {
	//carga el tablero inicial
	tablero = new Tablero(root);
	tablerosJsonizados.push(tablero->getJson());
	puntajeActual = 0;
	puntajeMaximo = root["Maximo score"].asUInt();
}

bool Juego::hayMasMovimientos()
{
	 return (tablero->hayMasMovimientos());
}

bool Juego::mover(Movimiento& mov)
{
	int puntajeAux = 0;
	puntajeActual = 0;

	unsigned filI = mov.getFilI();
	unsigned colI = mov.getColI();
	unsigned filF = mov.getFilF();
	unsigned colF = mov.getColF();

	puntajeAux = tablero->mover(filI, colI, filF, colF);

	if (puntajeAux > 0) {
		puntajeActual += puntajeAux;
		tablerosJsonizados.push(tablero->getJson());
		tablero->bajarCeldas();
		tablerosJsonizados.push(tablero->getJson());
		tablero->recargarVacios();
		tablerosJsonizados.push(tablero->getJson());

		while ((puntajeAux = tablero->buscarMatchLuegoDeMover()) > 0){
			puntajeActual += 2*puntajeAux; //recordar que se multiplica por 2
			tablerosJsonizados.push(tablero->getJson());
			tablero->bajarCeldas();
			tablerosJsonizados.push(tablero->getJson());
			tablero->recargarVacios();
			tablerosJsonizados.push(tablero->getJson());
		}
		return true;
	}else{
		return false;
	}
}

bool Juego::hayTableroParaEnviar()
{
	return !tablerosJsonizados.empty();
}

Json::Value Juego::obtenerTablero()
{
	Json::Value tablero = tablerosJsonizados.front();
	tablerosJsonizados.pop();
	return tablero;
}

unsigned Juego::obtenerPuntaje()
{
	return puntajeActual;
}

Juego::~Juego() {
	if(tablero)
		delete tablero;
}

unsigned Juego::getPuntajeMaximo()
{
	return puntajeMaximo;
}
